// ./models/User.js

const mongoose = require('mongoose');
const bcrypt = require('bcrypt');

const UserSchema = new mongoose.Schema(
    {
        username: {
            type: String,
            required: [true, '用户名是必填项'],
            unique: true,
            trim: true,
            maxlength: 30,
        },
        password: {
            type: String,
            required: [true, '密码是必填项'],
            minlength: 6,
            // 在查询时默认不返回密码字段
            select: false,
        },
        email: {
            type: String,
            trim: true,
            lowercase: true,
            unique: true,
            match: [/\S+@\S+\.\S+/, '邮箱格式不正确'],
        },
        // 头像路径 (用于文件上传功能)
        avatar: {
            type: String,
            default: '/uploads/default-avatar.png',
        },
        role: {
            type: String,
            enum: ['user', 'admin'],
            default: 'user',
        },
        createdAt: {
            type: Date,
            default: Date.now,
        },
    },
    {
        // 自动添加 createdAt 和 updatedAt 字段
        timestamps: true,
    }
);

// --- Mongoose Middleware (预保存钩子) ---

// 在保存用户数据之前执行此函数 (用于加密密码)
UserSchema.pre('save', async function (next) {
    // 只有在密码字段被修改或新建时才重新加密
    if (!this.isModified('password')) {
        return next();
    }

    try {
        // 生成盐值 (Salt)
        const salt = await bcrypt.genSalt(10);
        // 对密码进行哈希加密
        this.password = await bcrypt.hash(this.password, salt);
        next();
    } catch (error) {
        next(error);
    }
});

// --- 实例方法 ---

// 校验用户输入的密码是否正确
UserSchema.methods.comparePassword = async function (candidatePassword) {
    // 注意：这里的 this 是单个 User 文档，password 字段已通过 select: false 隐藏
    // Mongoose 会在执行这个方法时自动加载 password 字段
    return await bcrypt.compare(candidatePassword, this.password);
};

const User = mongoose.model('User', UserSchema);

module.exports = User;
